package com.zhoug.common3.chain;

/**
 * 拦截器,可以处理拦截请求
 * @Author 35574
 * @Date 2021/4/8
 * @Description
 */
public interface Interceptor<REQUEST extends IRequest,RESPONSE extends IResponse> {
    /**
     * 拦截请求做自己的处理
     * 可以自己处理返回结果,也可以调用chain.proceed()向下传递请求
     * @param chain 责任链
     * @return 返回结果
     */
    RESPONSE intercept(Chain<REQUEST, RESPONSE> chain);

    /**
     * 责任链
     *  由于我们的请求是以链式的方式进行的，这里定义了一个链用于传递请求
     */
    interface Chain<REQUEST extends IRequest,RESPONSE extends IResponse>{
        /**
         * 获取请求
         * @return
         */
        REQUEST request();

        /**
         * 向下一个传递请求
         * @param request 向下传递的请求
         * @return 返回结果
         */
        RESPONSE proceed(REQUEST request);
    }

}
